package com.luo.ai.assistant.chat.memory;

import com.luo.ai.assistant.conv.model.Chat;
import org.springframework.ai.chat.messages.Message;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

/**
 * 聊天列表缓存）
 *
 * @author luohq
 * @date 2025-02-18 16:27
 * @see MyRedisChatMemory_V2
 */
public class ChatsLocalCache {
    private List<Chat> chatList = new ArrayList<>();


    /**
     * 新增聊天记录
     *
     * @param chat 聊天记录
     */
    public void add(Chat chat) {
        this.chatList.add(chat);
    }

    /**
     * 新增聊天记录
     *
     * @param chatList 聊天记录列表
     */
    public void add(List<Chat> chatList) {
        this.chatList.addAll(chatList);
    }


    /**
     * 头部压缩聊天记录列表至指定大小
     *
     * @param maxSize 最大大小
     */
    public void ltrim(Integer maxSize) {
        if (0 < maxSize && this.chatList.size() > maxSize) {
            IntStream.range(0, this.chatList.size() - maxSize)
                    .forEach(i -> this.chatList.remove(0));
        }
    }

    /**
     * 清理过期消息记录
     *
     * @param expireTimeMills 过期时间点（该时间点之前的消息均已过期）
     */
    public void clearExpiredChats(Long expireTimeMills) {
        //如果过期时间小于等于0，则不清理
        if (0 >= expireTimeMills) {
            return;
        }

        //从头开始删除过期消息
        for (int i = 0; i < this.chatList.size(); ) {
            Long curCreateTimestamp = this.chatList.get(i).getId();
            if (curCreateTimestamp <= expireTimeMills) {
                this.chatList.remove(i);
                continue;
            }
            break;
        }
        //chatList.removeIf(chat -> chat.getId() <= expireTimeMills);
    }

    /**
     * 本地缓存的最大chat ID（最后一条消息的缓存时间）
     *
     * @return 最大chat ID（最后一条消息的缓存时间）
     */
    public Long getLastChatId() {
        return this.chatList.isEmpty() ? 0L : this.chatList.get(this.chatList.size() - 1).getId();
    }

    /**
     * 获取聊天记录列表
     *
     * @return 聊天记录列表
     */
    public List<Chat> getChatList() {
        return chatList;
    }

    /**
     * 获取聊天记录数量
     *
     * @return 聊天记录数量
     */
    public Integer getChatCount() {
        return this.chatList.size();
    }

    /**
     * 获取消息列表
     *
     * @return 消息列表
     */
    public List<Message> getMessageList() {
        return this.chatList.stream()
                .map(Chat.class::cast)
                .map(ChatMessageConvertor::toMessage)
                .collect(Collectors.toList());
    }

}
